package com.dev.springBootDemo.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author zhumq
 * @date 2024/7/2 20:57
 */
public class ProxyUtil {
    public static Star createProxy(SuperStar superStar) {
        /**
         * (lassLoader loader , Class<?>[] interfaces, InvocationHandler h )
         * 参数1：用于指定一个类加载器
         * 参数2：用于指定一个接口数组，因为一个代理类可以代理多个接口，所以可以指定多个接口
         *       也就是指定生成的代理长什么样
         * 参数3：用于指定一个InvocationHandler对象，当调用代理类的方法时，就会自动调用InvocationHandler中的invoke方法
         *       (指定InvocationHandler中的invoke方法，在调用Star接口中的方法时，就会自动执行)
         *       也就是生成的代理对象要做什么
         }
         */
        Star starProxy = (Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader()
                , new Class[]{Star.class}, new InvocationHandler() {
                    @Override // 回调方法
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        // 代理对象要做的事情
                        // 唱歌要先租场地，跳舞要去请老师教
                        if ("sing".equals(method.getName())) {
                            System.out.println("代理要去做：唱歌要先租场地");
                        } else if ("dance".equals(method.getName())) {
                            System.out.println("代理要去做：跳舞要去请老师教");
                        }
                        return method.invoke(superStar, args);
                    }
                });
        return starProxy;
    }
}
